package cn.com.zzl.util;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.JavaType;

import java.io.IOException;
import java.util.*;

/**
 * 该工具类主要是json字符串和pojo或者Map之间的转换关系，而不涉及JSONObject和JSONArray。
 * Description：JSON工具类（org.codehaus.jackson），
 * 				jackson是springmvc必须的，因为我们常用他提供的两个注解：ResponseBody 和 RequestBody
 * com.fasterxml.jackson 和  org.codehaus.jackson    springmvc框架二选一
 * Created by 朱正磊 on 2017-05-31 10:47.
 */
public class JSONTool {

	private final static ObjectMapper mapper = new ObjectMapper();//转换器

	/**
	 * ResponseBody注解的实现方式
	 * @Desc javaBean 转 json字符串
	 * @param javaBean
	 * @return
	 */
	public static String javaBean2JsonString(Object javaBean) throws IOException {
		return mapper.writeValueAsString(javaBean);//将javaBean转成json字符串
	}

	/**
	 * RequestBody注解的实现方式
	 * 说明：参数类型定义为Class<T>要比Class<?>好使，起码不需要强制转换。
	 * @Desc json字符串 转 javaBean
	 * @param jsonString
	 * @return
	 */
	public static <T> T jsonString2JavaBean(String jsonString, Class<T> clazz) throws IOException {
		 return mapper.readValue(jsonString, clazz);
	}

	/**
	 * RequestBody注解的实现方式
	 * @Desc json字符串 转 Map
	 * @param jsonString
	 * @return
	 */
	public static Map<?, ?> jsonString2Map(String jsonString) throws IOException {
		return mapper.readValue(jsonString, Map.class);//将json字符串转成Map
	}

	/**
	 * ResponseBody注解的实现方式
	 * @Desc Map 转 json字符串
	 * @param map
	 * @return
	 * @throws IOException
	 */
	public static String map2jsonString(Map<?, ?> map) throws IOException {
		return mapper.writeValueAsString(map);
	}

	/**
	 * 说明：这里我们处理掉异常，不往外抛。
	 * @Desc 将对象转换成json字符串。对象可以是pojo，也可以是Map。
	 * 		 当然了这里的对象不局限于单个对象，也包含集合对象！
	 * @param data pojo或者Map
	 * @return
	 */
	public static String objectToJson(Object data){
		try {
			return mapper.writeValueAsString(data);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 说明：这里我们处理掉异常，不往外抛。
	 * @Desc 将json字符串转化为pojo对象，如果不知道pojo的具体类型，我们可以使用Map。
	 * @param jsonData json字符串
	 * @param beanType 泛型反射
	 * @param <T>
	 * @return
	 */
	public static <T> T jsonToPojo(String jsonData, Class<T> beanType){
		try {
			return mapper.readValue(jsonData, beanType);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 说明：这里我们处理掉异常，不往外抛。
	 * @Desc 将json字符串转换成pojo对象的list集合，如果不知道pojo的具体类型，我们可以使用Map。
	 * @param jsonData json字符串
	 * @param beanType 泛型反射
	 * @param <T>
	 * @return
	 */
	public static <T> List<T> jsonToList(String jsonData, Class<T> beanType){
		//定义返回集合的类型，这里我们将pojo包装到List集合里，所以参数是List.class。
		JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, beanType);
		try {
			return mapper.readValue(jsonData, javaType);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

//	public static void main(String[] args) throws Exception {
//
//		People people = new People();
//		people.setId("01");
//		people.setName("张三");
//		people.setAge(33);
//		people.setPay(6666.88);
//		people.setValid(true);
//		people.setOne('E');
//		people.setBirthday(new Date());
//
//		Link link = new Link();
//		link.setAddress("河南省济源市");
//		link.setPhone("13899995555");
//		link.setQq("123456");
//		people.setLink(link);
//
//		Map map = new HashMap();
//		map.put("aa", "this is aa");
//		map.put("bb", "this is bb");
//		map.put("cc", "this is cc");
//		people.setMap(map);
//
//		List list = new ArrayList();
//		list.add("普洱");
//		list.add("大红袍");
//		people.setList(list);
//
//		Set set = new HashSet();
//		set.add("篮球");
//		set.add("足球");
//		set.add("乒乓球");
//		people.setSet(set);
//
//		ObjectMapper mapper = new ObjectMapper();//转换器
//
//		//1、javaBean 转 json字符串
//		String jsonString = mapper.writeValueAsString(people);//将javaBean转成json字符串
//		System.out.println(jsonString);
//
//		/**
//
//		 //javaBean 转成 json字符串
//		 {"id":"01","name":"张三","age":33,"pay":6666.88,"valid":true,"one":"E","birthday":1496212468750,
//		 "link":{"phone":"13899995555","address":"河南省济源市","qq":"123456"},//javaBean转成json对象
//		 "map":{"aa":"this is aa","bb":"this is bb","cc":"this is cc"},//Map转成json对象
//		 "list":["普洱","大红袍"],//List转成数组
//		 "set":["足球","篮球","乒乓球"]}//Set转成数组
//
//		 */
//
//		//**********************************************************************************************//
//
//		//2、json字符串 转 Map
//		Map mapValue = mapper.readValue(jsonString, Map.class);//将json字符串转成Map
//
//		System.out.println(mapValue);
//		// {id=01, name=张三, age=33, pay=6666.88, valid=true, one=E,
//		// birthday=1496213286459,
//		// link={phone=13899995555, address=河南省济源市, qq=123456},
//		// map={aa=this is aa, bb=this is bb, cc=this is cc},
//		// list=[普洱, 大红袍],
//		// set=[足球, 篮球, 乒乓球]}
//
//		System.out.println("pay：" + mapValue.get("pay").getClass().getName()); //java.lang.Double
//		System.out.println("valid：" + mapValue.get("valid").getClass().getName()); //java.lang.Boolean
//		System.out.println("birthday：" + mapValue.get("birthday").getClass().getName()); //java.lang.Long
//		System.out.println("link：" + mapValue.get("link").getClass().getName()); //java.util.LinkedHashMap
//		System.out.println("map：" + mapValue.get("map").getClass().getName()); //java.util.LinkedHashMap
//		System.out.println("list：" + mapValue.get("list").getClass().getName()); //java.util.ArrayList
//		System.out.println("set：" + mapValue.get("set").getClass().getName()); //java.util.ArrayList
//
//		/**
//
//		 pay：java.lang.Double
//		 valid：java.lang.Boolean
//		 birthday：java.lang.Long
//		 link：java.util.LinkedHashMap
//		 map：java.util.LinkedHashMap
//		 list：java.util.ArrayList
//		 set：java.util.ArrayList
//
//		 */
//
//		//**********************************************************************************************//
//
//		//3、Map 转 json字符串
//		jsonString = mapper.writeValueAsString(mapValue);
//		System.out.println(jsonString);
//
//		// {"id":"01","name":"张三","age":33,"pay":6666.88,"valid":true,"one":"E",
//		// "birthday":1496213817112,
//		// "link":{"phone":"13899995555","address":"河南省济源市","qq":"123456"},
//		// "map":{"aa":"this is aa","bb":"this is bb","cc":"this is cc"},
//		// "list":["普洱","大红袍"],
//		// "set":["足球","篮球","乒乓球"]}
//
//		//**********************************************************************************************//
//
//		//4、json字符串 转 javaBean
//		people = mapper.readValue(jsonString, People.class);
//
//		System.out.println("pay：" + people.getPay());
//		System.out.println("valid：" + people.isValid());
//		System.out.println("birthday：" + people.getBirthday());
//		System.out.println("link：" + people.getLink());
//		System.out.println("map：" + people.getMap());
//		System.out.println("list：" + people.getList());
//		System.out.println("set：" + people.getSet());
//
//		//pay：6666.88
//		//valid：true
//		//birthday：Wed May 31 15:04:31 CST 2017
//		//link：cn.itcast.ssm.po.Link@3ffc5af1
//		//map：{aa=this is aa, bb=this is bb, cc=this is cc}
//		//list：[普洱, 大红袍]
//		//set：[足球, 篮球, 乒乓球]
//
//		//**********************************************************************************************//
//
//		//5、
//
//
//	}

}
